package com.luckynote.common.base.util;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.lang.reflect.Type;

/**
 **
 * <pre>
 * *********************************************
 * Copyright LUCKY-NOTE.
 * All rights reserved.
 * ****************************************************
 *  Version       Date         Author            Desc
 *    v1.0       2019/6/29      bingo           Bean转换工具类
 * ****************************************************
 * </pre>
 */
public class BeanUtil {

    /**
     * 对象转为json数据
     * @param source 待转换的对象
     * @return Json字符串
     */
    public static String toJson(Object source) {
        return BeanUtil.toJson(source, null);
    }

    /**
     * 对象转为Json数据
     * @param source 待转换的对象
     * @param datePattern 时间格式，与SimpleDateFormat兼容
     * @return Json字符串
     */
    public static String toJson(Object source, String datePattern) {
        if ( source == null )
            return "{}";
        String pattern = "yyyy-MM-dd HH:mm:ss";
        if ( StringUtil.isNotEmptyString(datePattern) )
            pattern = datePattern;

        Gson gson = new GsonBuilder().setDateFormat(pattern).create();
        return gson.toJson(source);
    }

    /**
     * 将json字符串转为指定类型对象
     * <pre>
     * 泛型：
     * List&lt;OrderInfo&gt; result = QBBeanUtil.fromJson(jsonString, new QBTypeToken&lt;List&lt;OrderInfo&gt;&gt;(){}.getType());
     * 非泛型：
     * OrderInfo o = QBBeanUtil.fromJson(singleOrderBy, OrderInfo.class);
     * </pre>
     * @param <T> bean的类型
     * @param jsonString json字符串
     * @param typeOfT 转换为哪个类
     * @return 转换后的对象，如果jsonString为null则返回结果也为null
     */
    public static <T> T fromJson(String jsonString, Type typeOfT) {
        return BeanUtil.fromJson(jsonString, typeOfT, null);
    }

    /**
     * 将json字符串转为指定类型对象
     * <pre>
     * 泛型：
     * List&lt;OrderInfo&gt; result = QBBeanUtil.fromJson(jsonString, new QBTypeToken&lt;List&lt;OrderInfo&gt;&gt;(){}.getType());
     * 非泛型：
     * OrderInfo o = QBBeanUtil.fromJson(singleOrderBy, OrderInfo.class, "yyyy-MM-dd");
     * </pre>
     * @param <T> bean的类型
     * @param jsonString json字符串
     * @param typeOfT 转换为哪个类
     * @param datePattern 时间格式，必须与{@code SimpleDateFormat}兼容
     * @return 转换后的对象，如果jsonString为null则返回结果也为null
     */
    @SuppressWarnings("unchecked")
    public static <T> T fromJson(String jsonString, Type typeOfT, String datePattern) {
        if ( StringUtil.isEmptyString(jsonString) )
            return null;
        if ( typeOfT.getTypeName().equals("java.lang.String") )
            return (T) jsonString;

        String pattern = "yyyy-MM-dd HH:mm:ss";
        if ( StringUtil.isNotEmptyString(datePattern) )
            pattern = datePattern;

        Gson gson = new GsonBuilder().setDateFormat(pattern).create();
        return gson.fromJson( jsonString, typeOfT );
    }

    /**
     * 是否JAVA原始类型的封装，含String
     * @param type 待判断的类型
     * @return 是/否
     */
    public static boolean isPrimitiveWrapperType(Class<?> type) {
        return PrimitiveTypeUtil.isWrapperType(type);
    }

}
